package d10_homework;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client01 {
    public static void main(String[] args) {
        try {
            //目标: 掌握java网路编程的基本使用
            //1、使用TCP通信-->创建于socket对象,并绑定端口号,请求与服务端的socket管道连接
            //注意这是根据这个ip 与 端口,取连接服务端
            Socket socket = new Socket("127.0.0.1", 8848);//有异常直接抛出去
            //后加1、创建file
            File file = new File("" +
                    "javapromax\\day13-net\\src\\陈某.txt");
            //对文件做极端判断
            if (!file.exists() || !file.isFile() || !file.getName().endsWith(".txt")) {
                //不进行发送,直接结束方法
                return;
            }
            //2、创建一个字节输入缓冲流管道与源文件接通
            DataInputStream socketBis = new DataInputStream(socket.getInputStream());
            //3、从socket管道中的到一个字节输出流,往外写数据出去
            //注意这个不是普通的输出管道, 因为是由socket对象得到的,所以是会流向接收端
            OutputStream os = socket.getOutputStream();

            //4、把低级流包装成特殊输出流
            DataOutputStream dos = new DataOutputStream(os);
            //11、在这里进行发出请求
            //11.1定义一个扫描器
            Scanner sc = new Scanner(System.in);


            while (true) {



                //11.2提示用户进行输出,请求,--->只是模拟一下,其实只能输出发送文件
                String require = sc.next();

                //加多一个退出机制
                if ("exit".equals(require)){
                    //关闭管道------------>不用担心,是否上传完毕-->TCP协议有四次挥手机制
                    socket.close();
                    break;
                    //客户端下线,进行关闭管道退出
                }

                //11.2进行请求发送
                dos.writeUTF(require);
                //8、等待服务端的反馈
                //使用特殊数据流做

//                Thread.sleep(100000);
                //9、等待读取反馈数据
                String data = socketBis.readUTF();//在这里进行等待,如果服务端,进行会送数据,就进行上传文件
                //10、对反馈数据记性输出
                System.out.println("服务器端反馈:" + data);
                //5、开始读数据到内存中
                //5.1准备一个桶,用于读取数据


                InputStream bis = new BufferedInputStream(new FileInputStream(file));
                //5.2定义一个变量,记录读取到的字节个数
                byte[] buffer = new byte[1024];
                String message = "";
                int len;
                //5.3循环开始读取
                //注意流有一个指针,读文件是后往后移动,督导末尾就会返回-1,不会往回走,如果下次还想重读,就的重置流
                while ((len = bis.read(buffer)) != -1) {
                    //5.4将读取到的数据进行解码
                   message = new String(buffer, 0, len);
                    System.out.println(message);
                    //6、发送数据出去服务器
                    //通信很严格,别人用什么发,你这边就用什么流接
                    //别人发什么数据类型,你就的用什么数据类型
                    dos.writeUTF(message);
                }

                /*if (message.length() == 0){
                    dos.writeUTF("文件已经复制发送过了");
                }*/
                //上传完毕之后,进行关闭输出管道,等待保留输入管道,等待,服务端反馈,看是否成功
                //7、最后进行关闭资源-->先进行关闭读取管道
//                socket.shutdownInput();//作用: 关闭socket的输出流(发送管道), 保持输出流(介绍管道仍然可以使用)
                //12、进行等待,最终的结果
                String rs = socketBis.readUTF();//读取一行字符串

                //13、最终输出结果
                System.out.println("上传结果" + rs);
                System.out.println(
                        "-------------------------"
                );
//            socket.close();
            }


//            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
